import { BeforeInsert, BeforeUpdate } from "typeorm";

/**
 * 自动时间戳装饰器
 * 用于MySQL 5.5兼容的自动时间戳设置
 *
 * 使用方法：
 * @Entity()
 * @AutoTimestamp()
 * export class YourEntity {
 *   @Column("datetime", { name: "created_at", comment: "创建时间" })
 *   created_at!: Date;
 *
 *   @Column("datetime", { name: "updated_at", comment: "更新时间", nullable: true })
 *   updated_at!: Date | null;
 * }
 */
export function AutoTimestamp() {
  return function (target: any) {
    // 添加BeforeInsert钩子
    const originalBeforeInsert = target.prototype.beforeInsert;
    target.prototype.beforeInsert = function () {
      // 如果created_at为空，设置为当前时间
      if (this.created_at === null || this.created_at === undefined) {
        this.created_at = new Date();
      }

      // 调用原有的beforeInsert方法（如果存在）
      if (originalBeforeInsert) {
        originalBeforeInsert.call(this);
      }
    };

    // 添加BeforeUpdate钩子
    const originalBeforeUpdate = target.prototype.beforeUpdate;
    target.prototype.beforeUpdate = function () {
      // 设置updated_at为当前时间
      this.updated_at = new Date();

      // 调用原有的beforeUpdate方法（如果存在）
      if (originalBeforeUpdate) {
        originalBeforeUpdate.call(this);
      }
    };
  };
}

/**
 * 手动设置时间戳的辅助方法
 * 可以在服务层手动调用
 */
export class TimestampHelper {
  /**
   * 设置创建时间
   */
  static setCreatedAt(entity: any): void {
    if (entity.created_at === null || entity.created_at === undefined) {
      entity.created_at = new Date();
    }
  }

  /**
   * 设置更新时间
   */
  static setUpdatedAt(entity: any): void {
    entity.updated_at = new Date();
  }

  /**
   * 设置创建和更新时间
   */
  static setTimestamps(entity: any, isUpdate: boolean = false): void {
    if (!isUpdate) {
      this.setCreatedAt(entity);
    }
    this.setUpdatedAt(entity);
  }
}
